package se.sll.service.catalogue.common.property;

import java.io.Serializable;
import java.util.Properties;

/**
 * Hanterar properties inom ramverket.
 * Klassen möjliggör avancerad property-hantering och dynamisk överlagring för
 * olika miljöer.<br>Klassen cachar upp alla properties för snabbast möjliga access.
 * <p>
 * Klassen möjliggör dynamisk överlagring av properties för olika miljöer, det innebär att
 * man kan definiera sina miljöberoende properties i en separat .jar fil som
 * läggs på classpath. Denna property-jar fil måste innehålla en
 * propertyfil som heter <b>domain.properties</b>. De properties som deklareras i denna fil
 * överlagrar de properties som finns deklarerade i de vanliga propertyfilerna. På så sätt
 * kan man skapa olika property-jar filer för olika miljöer.
 *
 * @author Tomas Wenngren, Modul1
 * @author Jiri Uosukainen
 */
public class M1Properties implements Serializable
{
    private static final long serialVersionUID = 1L;
    
    public interface NAMED_PROPERTY{
        public String propertyName();
        public String description();
    }
   
    // Här lagras alla properties
    private Properties masterProps;
    
    private static M1Properties theInstance;
   
    
    private M1Properties()
    {
        initInstance();
    }

    /**
     * Returnerar en singleton instans.
     *
     * @return
     */
//    public static M1Properties getInstance()
    static M1Properties getInstance()
    {
        if(theInstance == null)
        {
            theInstance = new M1Properties();
        }
        return theInstance;
    }
    
    private void initInstance() 
    {
        masterProps = M1PropertyLoader.getApplicationProperties();

    }
    
    /**
     * Hämta en enskild property
     * 
     * @param propertyName Namnet på den property som du söker
     */
//    public String getProperty(String propertyName)
    String getProperty(String propertyName)
    {
        // Property från property fil
        String returnProperty = masterProps.getProperty(propertyName);

        return returnProperty;
    }
    
//    public String getNamedProperty(NAMED_PROPERTY prop){
    String getNamedProperty(NAMED_PROPERTY prop){
        // Property från property fil
        String returnProperty = masterProps.getProperty(prop.propertyName());

        return returnProperty;
    }
    
    
    
    /**
     * Sätter en enskild property. Möjliggär konfigurering från admin-verktyg
     */
//    public void setProperty(String propertyName, String newPropertyValue)
//    {
//        if (masterProps.containsKey(propertyName))
//        {
//            masterProps.setProperty(propertyName, newPropertyValue);
//        }
//    }
    
    /**
     * Returnerar alla properties som finns tillgängliga.
     * 
     * @return
     */
//    public Properties getProperties()
    Properties getProperties()
    {
        return masterProps;
    }
}